package GestorUsuarios;

/**
 * @file RolDAO.java
 * @brief Implementa la clase RolDAO
 * 
 * Implementa la clase RolDAO usada para manejar la información de
 * los usuarios del sistema en la base de datos.
 * 
 * @author Juan Miguel Fernández Pelegrina
 * @version 01.01
 * 
 */

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import Servicios.Conexion;

/**
 * @class RolDAO
 * 
 * @brief Se encarga de realizar las operaciones para manejar la información de
 * 		  los roles  del sistema en la base de datos.
 * 
 *        Se encarga de realizar las operaciones para manejar la información de
 *		  los roles del sistema. Permite realizar búsquedas, añadirlos a la
 *		  base de datos, etc.
 * 
 */

public class RolDAO {

	/**
	 * @brief Obtiene el rol por el nombre
	 * @param nombre Nombre del rol a buscar
	 * @throws ClassNotFoundException, IOException, SQLException 
	 */
	public static Rol get(String nombre) throws SQLException, IOException, ClassNotFoundException  {
		Rol rol;
		Conexion.conectar();

		ResultSet tabla  = Conexion.consultar("SELECT * FROM Rol WHERE nombre = \'"+ nombre +"\' ;");
			
		if(tabla.next()) { // Encontrado
			rol = new Rol(tabla.getInt("idRol"),nombre);
		} else {
			rol = null;
		}
		Conexion.desconectar();
		return rol;
	}
	
	/**
	 * @brief Obtiene todos los roles
	 * @throws ClassNotFoundException, IOException, SQLException 
	 */
	public static Rol [] get() throws SQLException, IOException, ClassNotFoundException  {
		Rol [] roles;
		Conexion.conectar();

		ResultSet tabla  = Conexion.consultar("SELECT * FROM Rol;");
			
		ArrayList<Rol> list_roles = new ArrayList<Rol>();
		
		while(tabla.next()) {
			list_roles.add(new Rol(tabla.getInt("idRol"),tabla.getString("nombre")));
		}
	
		Conexion.desconectar();
		
		if(list_roles.size()>0) {
			roles = new Rol[list_roles.size()];
			list_roles.toArray(roles);
			return roles;
		}
		else return null;
	}
	
	/**
	 * @brief Obtiene el rol por el id
	 * @param id Id del rol a buscar
	 * @throws ClassNotFoundException, IOException, SQLException 
	 */
	public static Rol get(int id) throws SQLException, IOException, ClassNotFoundException {
		Rol rol;
		Conexion.conectar();
		ResultSet tabla = Conexion.consultar("SELECT * FROM Rol WHERE idRol = "+ id +";");
		if(tabla.next()) { // Encontrado
			rol = new Rol(id,tabla.getString("nombre"));
		} else {
			rol = null;
		}
		Conexion.desconectar();
		return rol;
	}
		
	
	/**
	 * @brief Obtiene el rol de un medico
	 * @param id Id del medico del que queremos saber su rol
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static Rol getRol(int idMedico) throws SQLException, IOException, ClassNotFoundException {
		
		int id;
		String nombre;
		Rol rol;
		
		Conexion.conectar();
		//buscamos en tieneRol el idRol asociado al idMedico
		ResultSet tabla = Conexion.consultar("SELECT idRol FROM tieneRol WHERE tieneRol.idUsuario = "+ idMedico +";");
		
		if(tabla.next()) { // Encontrado
			id = tabla.getInt("idRol");
			
			// Buscamos en Rol el idRol para sacar el nombre
			tabla = Conexion.consultar("SELECT nombre FROM Rol WHERE Rol.idRol = "+ id +";");
		
			if(tabla.next()) { // Encontrado
				nombre = tabla.getString("nombre");
				rol = new Rol(id,nombre);		
			} else {
				rol = null;
			}
						
		} else {
			rol = null;
		}

		Conexion.desconectar();
		return rol;

	}
	
	
	
	/**
	 * @brief Establece el rol de un medico
	 * @param idMedico Id del medico
	 * @param nombre Nombre del rol
	 * @throws ClassNotFoundException, IOException, SQLException, IDException
	 */
	public static void setRol(int idMedico,String nombre) throws SQLException, IOException, ClassNotFoundException, NoSuchAlgorithmException {

		// Se le asigna a rol el nombre y la idRol de la base de datos
		Rol rol = Rol.get(nombre);
		
		Conexion.conectar();
		
		// Insertamos en la base de datos en la tabla tieneRol 
		
		Conexion.actualizar("INSERT tieneRol(idUsuario,idRol) VALUES ("+idMedico+","+ rol.getIdRol() + ");");
		Conexion.desconectar();
		
	}
	
	public static void deleteRolUsuario(int idMedico) throws SQLException, IOException, ClassNotFoundException, NoSuchAlgorithmException {
		Conexion.conectar();
		Conexion.actualizar("DELETE FROM tieneRol WHERE idUsuario=\'"+idMedico+"\';");
		Conexion.desconectar();
		
	}
}